import UIAbility from '@ohos.app.ability.UIAbility';
import hilog from '@ohos.hilog';
import window from '@ohos.window';
import router from '@ohos.router';

/**
 * 应用入口能力类
 * 
 * 这是鸿蒙应用的主入口类，继承自UIAbility，负责管理应用的生命周期。
 * 它处理应用的创建、销毁、前后台切换等状态变化，并管理应用的主窗口。
 */
export default class EntryAbility extends UIAbility {
  // 日志标签，用于标识日志来源
  private static readonly TAG = 'EntryAbility';
  
  // 窗口宽度常量
  private static readonly WINDOW_WIDTH = 720;
  
  // 窗口高度常量
  private static readonly WINDOW_HEIGHT = 1280;  /**
   * 应用创建时调用
   * 
   * 当系统首次创建应用实例时调用此方法。在此方法中执行应用的初始化操作，
   * 如设置全局变量、初始化数据服务等。
   * 
   * @param want 启动参数，包含启动应用时的意图信息
   * @param launchParam 启动参数，包含启动模式等信息
   */
  onCreate(want: any, launchParam: any) {
    hilog.info(0x0000, EntryAbility.TAG, '%{public}s', 'Ability onCreate');
    // 初始化应用数据
    this.initializeAppData();
  }

  /**
   * 应用销毁时调用
   * 
   * 当应用实例被销毁时调用此方法。在此方法中执行清理操作，
   * 如保存数据、释放资源等。
   */
  onDestroy() {
    hilog.info(0x0000, EntryAbility.TAG, '%{public}s', 'Ability onDestroy');
    // 清理资源
    this.cleanupResources();
  }

  /**
   * 窗口创建时调用
   * 
   * 当应用的主窗口创建完成时调用此方法。在此方法中设置窗口属性，
   * 加载主页面等。
   * 
   * @param windowStage 窗口阶段对象，用于管理应用窗口
   */
  onWindowStageCreate(windowStage: window.WindowStage) {
    hilog.info(0x0000, EntryAbility.TAG, '%{public}s', 'Ability onWindowStageCreate');
    
    // 设置主窗口
    this.setupMainWindow(windowStage);
    
    // 加载主页面
    windowStage.loadContent('pages/MainPage', (err: any, data: any) => {
      if (err?.code) {
        hilog.error(0x0000, EntryAbility.TAG, 'Failed to load the content. Cause: %{public}s', JSON.stringify(err));
        return;
      }
      hilog.info(0x0000, EntryAbility.TAG, 'Succeeded in loading the content. Data: %{public}s', JSON.stringify(data));
    });
  }

  /**
   * 窗口销毁时调用
   * 
   * 当应用的主窗口即将销毁时调用此方法。在此方法中执行与窗口相关的清理操作。
   */
  onWindowStageDestroy() {
    hilog.info(0x0000, EntryAbility.TAG, '%{public}s', 'Ability onWindowStageDestroy');
  }

  /**
   * 应用进入前台时调用
   * 
   * 当应用从后台切换到前台时调用此方法。在此方法中执行应用进入前台后的操作，
   * 如刷新数据、恢复动画等。
   */
  onForeground() {
    hilog.info(0x0000, EntryAbility.TAG, '%{public}s', 'Ability onForeground');
    // 应用进入前台时刷新数据
    this.refreshData();
  }

  /**
   * 应用进入后台时调用
   * 
   * 当应用从前台切换到后台时调用此方法。在此方法中执行应用进入后台前的操作，
   * 如保存数据、暂停动画等。
   */
  onBackground() {
    hilog.info(0x0000, EntryAbility.TAG, '%{public}s', 'Ability onBackground');
    // 应用进入后台时保存状态
    this.saveAppState();
  }

  /**
   * 初始化应用数据
   * 
   * 在应用启动时初始化必要的数据，如设置默认配置、
   * 初始化全局状态等。
   */
  private initializeAppData(): void {
    hilog.info(0x0000, EntryAbility.TAG, '%{public}s', 'Initializing app data');
    // 这里可以初始化一些全局数据或配置
  }

  /**
   * 设置主窗口
   * 
   * 配置应用主窗口的属性，如背景色、系统栏显示等。
   * 
   * @param windowStage 窗口阶段对象
   */
  private setupMainWindow(windowStage: window.WindowStage): void {
    windowStage.getMainWindow((err, data) => {
      if (err.code) {
        hilog.error(0x0000, EntryAbility.TAG, 'Failed to obtain the main window. Cause: %{public}s', JSON.stringify(err) ?? '');
        return;
      }
      
      // 设置窗口属性
      data.setWindowBackgroundColor('#F5F5F5');
      data.setWindowSystemBarEnable(['status', 'navigation']);
      
      // 设置窗口大小（可选）
      data.resize(EntryAbility.WINDOW_WIDTH, EntryAbility.WINDOW_HEIGHT);
      
      hilog.info(0x0000, EntryAbility.TAG, 'Succeeded in obtaining and setting the main window.');
    });
  }

  /**
   * 清理资源
   * 
   * 在应用销毁前清理资源，如取消定时器、关闭连接等。
   */
  private cleanupResources(): void {
    hilog.info(0x0000, EntryAbility.TAG, '%{public}s', 'Cleaning up resources');
    // 这里可以清理一些全局资源
  }

  /**
   * 刷新数据
   * 
   * 当应用从后台切换到前台时，刷新数据以保持最新状态。
   */
  private refreshData(): void {
    hilog.info(0x0000, EntryAbility.TAG, '%{public}s', 'Refreshing data');
    // 这里可以刷新一些数据
  }

  /**
   * 保存应用状态
   * 
   * 当应用进入后台时，保存当前状态以便恢复。
   */
  private saveAppState(): void {
    hilog.info(0x0000, EntryAbility.TAG, '%{public}s', 'Saving app state');
    // 这里可以保存应用状态到本地存储
  }
}